C 基础语法学习
变量
变量的声明有两种情况(定义和声明),一种是定义了变量并分配了内存给它,还有一种则是声明有这个变量,实际上它可以是在其它文件上有定义
extern int i; //声明,不是定义 这里并没有分配内存给 i
int i; //声明,也是定义 这里实际分配了内存给 i
extern 关键字用于在一个文件中引用另一个文件中定义的变量或者函数(其实这个主要是用于引用函数)
例如,如下例子,创建两个文件
addtwonum.c 文件代码:
#include <stdio.h>
/*外部变量声明*/
extern int x ;
extern int y ;
int addTwoNum()
{
return x+y;
}
test.c 文件代码:
#include <stdio.h>
/*定义两个全局变量*/
int x=1;
int y=2;
int addTwoNum();
int main(void)
{
int result;
result = addTwoNum();
printf("result 为: %d\n",result);
return 0;
}
除了上面那种在不同文件使用的例子,extern 还可以用于改变变量的声明位置
#include<stdio.h>
int func();
int main()
{
func(); //1
// 利用 extern 关键字先声明一下 num 变量,告诉编译器 num 这个变量是存在的,但是不是在这之前声明的,你到别的地方找找吧
// 但是如果不存在的话还是会报错的
extern int num;
printf("%d",num); //2
return 0;
}
int num = 3;
int func()
{
printf("%d\n",num);
}
可变参数
需要使用 stdarg.h 头文件,使用步骤如下
- 定义一个函数,最后一个参数为省略号,省略号前面可以设置自定义参数。
- 在函数定义中创建一个
va_list类型变量,该类型是在 stdarg.h 头文件中定义的。 - 使用 int 参数和
va_start宏来初始化va_list变量为一个参数列表。宏va_start是在 stdarg.h 头文件中定义的。 - 使用
va_arg宏和va_list变量来访问参数列表中的每个项。 - 使用宏
va_end来清理赋予va_list变量的内存。
#include <stdio.h>
#include <stdarg.h>
double average(int num,...)
{
va_list valist;
double sum = 0.0;
int i;
/* 为 num 个参数初始化 valist */
va_start(valist, num);
/* 访问所有赋给 valist 的参数 */
for (i = 0; i < num; i++)
{
sum += va_arg(valist, int);
}
/* 清理为 valist 保留的内存 */
va_end(valist);
return sum/num;
}
int main()
{
printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5));
printf("Average of 5, 10, 15 = %f\n", average(3, 5,10,15));
}
输出为
Average of 2, 3, 4, 5 = 3.500000
Average of 5, 10, 15 = 10.000000
定义常量
整数常量
整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。
212 /* 合法的 */
215u /* 合法的 */
0xFeeL /* 合法的 */
078 /* 非法的:8 不是八进制的数字 */
032UU /* 非法的:不能重复后缀 */
浮点数常量
当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。带符号的指数是用 e 或 E 引入的。
3.14159 /* 合法的 */
314159E-5L /* 合法的 */
510E /* 非法的:不完整的指数 */
210f /* 非法的:没有小数或指数 */
.e55 /* 非法的:缺少整数或分数 */